package com.gitee.zhuyb.util;

import org.apache.poi.ooxml.POIXMLDocument;
import org.apache.poi.ooxml.POIXMLDocumentPart;
import org.apache.poi.openxml4j.exceptions.InvalidFormatException;
import org.apache.poi.util.Units;
import org.apache.poi.xwpf.usermodel.XWPFChart;
import org.apache.poi.xwpf.usermodel.XWPFDocument;
import org.openxmlformats.schemas.drawingml.x2006.chart.CTBarChart;
import org.openxmlformats.schemas.drawingml.x2006.chart.CTChart;
import org.openxmlformats.schemas.drawingml.x2006.chart.CTLineChart;
import org.openxmlformats.schemas.drawingml.x2006.chart.CTPlotArea;

import java.io.IOException;
import java.util.List;
import java.util.Map;

/**
 * @version 1.0.0
 * @Description: word工具类
 * @Date: 2021/12/25 14:39
 * @Copyright (C) ZhuYouBin
 */
public class WordUtil {

    /**
     * 获取word文档对象
     * @return
     */
    public static XWPFDocument createDocument() {
        return new XWPFDocument();
    }

    /**
     * 获取word文档对象【指定模板文件】
     * @param templatePath
     * @return
     */
    public static XWPFDocument createDocument(String templatePath) throws IOException {
        return new XWPFDocument(POIXMLDocument.openPackage(templatePath));
    }

    /**
     * 获取图表对象【大小自适应】
     * @param document
     * @return
     * @throws IOException
     * @throws InvalidFormatException
     */
    public static XWPFChart createChart(XWPFDocument document) throws IOException, InvalidFormatException {
        return document.createChart(15 * Units.EMU_PER_CENTIMETER, 10 * Units.EMU_PER_CENTIMETER);
    }

    /**
     * 刷新折线图
     * @param poixmlDocumentPart 图表对象【柱状图、折线图、饼状图、雷达图等等】
     * @param firstRowTitle excel表格第一行的数据名称
     * @param firstColTitle excel表格每一列的数据名称【用于map获取数据】
     * @param rowDataList excel每行需要填充的数据
     * @return
     */
    public static void replaceLineChart(POIXMLDocumentPart poixmlDocumentPart,
                                        List<String> firstRowTitle,
                                        List<String> firstColTitle,
                                        List<Map<String, String>> rowDataList) {
        // 折线图系列数量,也就是线条数量,减1是第一列不算
        int lines = firstRowTitle.size() - 1;

        // 1、chart图表对象
        XWPFChart lineChart = (XWPFChart) poixmlDocumentPart;
        CTChart lineCTChart = lineChart.getCTChart();
        CTPlotArea plotArea = lineCTChart.getPlotArea();
        // 获取折线图数据区域
        CTLineChart ctLineChart = plotArea.getLineChartArray(0);
        // 清除图表的样式，由代码自己设置
        ctLineChart.getSerList().clear();

        // 2、刷新图表中的excel数据表格
        ExcelUtil.refreshExcel(lineChart, firstRowTitle, firstColTitle, rowDataList);

        // 3、刷新图表数据
        ChartUtil.refreshLineChart(ctLineChart, lines, 1, firstRowTitle, firstColTitle, rowDataList);
    }

    /**
     * 刷新柱状图
     * @param poixmlDocumentPart 图表对象【柱状图、折线图、饼状图、雷达图等等】
     * @param firstRowTitle excel表格第一行的数据名称
     * @param firstColTitle excel表格每一列的数据名称【用于map获取数据】
     * @param rowDataList excel每行需要填充的数据
     * @return
     */
    public static void replaceBarChart(POIXMLDocumentPart poixmlDocumentPart,
                                        List<String> firstRowTitle,
                                        List<String> firstColTitle,
                                        List<Map<String, String>> rowDataList) {
        // 柱状图系列数量,也就是柱子数量,减1是第一列不算
        int lines = firstRowTitle.size() - 1;

        // 1、chart图表对象
        XWPFChart chart = (XWPFChart) poixmlDocumentPart;
        CTChart ctChart = chart.getCTChart();
        CTPlotArea plotArea = ctChart.getPlotArea();
        // 获取柱状图数据区域
        CTBarChart ctBarChart = plotArea.getBarChartArray(0);
        // 清除图表的样式，由代码自己设置
        ctBarChart.getSerList().clear();

        // 2、刷新图表中的excel数据表格
        ExcelUtil.refreshExcel(chart, firstRowTitle, firstColTitle, rowDataList);

        // 3、刷新图表数据
        ChartUtil.refreshBarChart(ctBarChart, lines, 1, firstRowTitle, firstColTitle, rowDataList);
    }



}
